/**
 * @fileOverview The "show border" plugin. The command display visible outline
 * border line around all table elements if table doesn't have a none-zero 'border' attribute specified.
 */
(function() {
   var commandDefinition = {
      preserveState: true,
      editorFocus: false,
      readOnly: 1,

      exec: function( editor ) {
         this.toggleState();
         this.refresh( editor );
      },

      refresh: function( editor ) {
         if ( editor.document ) {
            var funcName = ( this.state == VED.TRISTATE_ON ) ? 'attachClass' : 'removeClass';
            editor.editable()[ funcName ]( 'ved_show_borders' );
         }
      }
   };

   var showBorderClassName = 'ved_show_border';

   VED.plugins.add( 'showborders', {
      modes: { 'wysiwyg':1 },

      onLoad: function() {
         var cssStyleText,
            cssTemplate =
         // TODO: For IE6, we don't have child selector support,
         // where nested table cells could be incorrect.
         ( VED.env.ie6Compat ? [
            '.%1 table.%2,',
               '.%1 table.%2 td, .%1 table.%2 th',
               '{',
               'border : #d3d3d3 1px dotted',
               '}'
            ] : [
            '.%1 table.%2,',
            '.%1 table.%2 > tr > td, .%1 table.%2 > tr > th,',
            '.%1 table.%2 > tbody > tr > td, .%1 table.%2 > tbody > tr > th,',
            '.%1 table.%2 > thead > tr > td, .%1 table.%2 > thead > tr > th,',
            '.%1 table.%2 > tfoot > tr > td, .%1 table.%2 > tfoot > tr > th',
            '{',
               'border : #d3d3d3 1px dotted',
            '}'
            ] ).join( '' );

         cssStyleText = cssTemplate.replace( /%2/g, showBorderClassName ).replace( /%1/g, 'ved_show_borders ' );

         VED.addCss( cssStyleText );
      },

      init: function( editor ) {

         var command = editor.addCommand( 'showborders', commandDefinition );
         command.canUndo = false;

         if ( editor.config.startupShowBorders !== false )
            command.setState( VED.TRISTATE_ON );

         // Refresh the command on setData.
         editor.on( 'mode', function() {
            if ( command.state != VED.TRISTATE_DISABLED )
               command.refresh( editor );
         }, null, null, 100 );

         // Refresh the command on wysiwyg frame reloads.
         editor.on( 'contentDom', function() {
            if ( command.state != VED.TRISTATE_DISABLED )
               command.refresh( editor );
         });

         editor.on( 'removeFormatCleanup', function( evt ) {
            var element = evt.data;
            if ( editor.getCommand( 'showborders' ).state == VED.TRISTATE_ON && element.is( 'table' ) && ( !element.hasAttribute( 'border' ) || parseInt( element.getAttribute( 'border' ), 10 ) <= 0 ) )
               element.addClass( showBorderClassName );
         });
      },

      afterInit: function( editor ) {
         var dataProcessor = editor.dataProcessor,
            dataFilter = dataProcessor && dataProcessor.dataFilter,
            htmlFilter = dataProcessor && dataProcessor.htmlFilter;

         if ( dataFilter ) {
            dataFilter.addRules({
               elements: {
                  'table': function( element ) {
                     var attributes = element.attributes,
                        cssClass = attributes[ 'class' ],
                        border = parseInt( attributes.border, 10 );

                     if ( ( !border || border <= 0 ) && ( !cssClass || cssClass.indexOf( showBorderClassName ) == -1 ) )
                        attributes[ 'class' ] = ( cssClass || '' ) + ' ' + showBorderClassName;
                  }
               }
            });
         }

         if ( htmlFilter ) {
            htmlFilter.addRules({
               elements: {
                  'table': function( table ) {
                     var attributes = table.attributes,
                        cssClass = attributes[ 'class' ];

                     cssClass && ( attributes[ 'class' ] = cssClass.replace( showBorderClassName, '' ).replace( /\s{2}/, ' ' ).replace( /^\s+|\s+$/, '' ) );
                  }
               }
            });
         }
      }
   });

   // Table dialog must be aware of it.
   VED.on( 'dialogDefinition', function( ev ) {
      var dialogName = ev.data.name;

      if ( dialogName == 'table' || dialogName == 'tableProperties' ) {
         var dialogDefinition = ev.data.definition,
            infoTab = dialogDefinition.getContents( 'info' ),
            borderField = infoTab.get( 'txtBorder' ),
            originalCommit = borderField.commit;

         borderField.commit = VED.tools.override( originalCommit, function( org ) {
            return function( data, selectedTable ) {
               org.apply( this, arguments );
               var value = parseInt( this.getValue(), 10 );
               selectedTable[ ( !value || value <= 0 ) ? 'addClass' : 'removeClass' ]( showBorderClassName );
            };
         });

         var advTab = dialogDefinition.getContents( 'advanced' ),
            classField = advTab && advTab.get( 'advCSSClasses' );

         if ( classField ) {
            classField.setup = VED.tools.override( classField.setup, function( originalSetup ) {
               return function() {
                  originalSetup.apply( this, arguments );
                  this.setValue( this.getValue().replace( /ved_show_border/, '' ) );
               };
            });

            classField.commit = VED.tools.override( classField.commit, function( originalCommit ) {
               return function( data, element ) {
                  originalCommit.apply( this, arguments );

                  if ( !parseInt( element.getAttribute( 'border' ), 10 ) )
                     element.addClass( 'ved_show_border' );
               };
            });
         }
      }
   });

})();






